package com.jqq.api.preparestatement;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;

/**
 * @author 姬倩倩
 * @version 1.0
 * 使用预编译statement完成用户登录
 * TODO：防止注入攻击 | 演示ps的使用流程
 */
public class PSUserLoginPart {
    public static void main(String[] args) throws Exception {
        //1.获取用户输入信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入账号：");
        String account = scanner.nextLine();
        System.out.println("请输入密码：");
        String password = scanner.nextLine();

        //2.ps的数据库流程
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///test_q?user=root&password=123456");

        //3.发送SQL语句，并且获取返回结果
        /**
         * preparedStatement
         *  1.编写SQL语句结构 不包含动态值部分的语句，动态值部分使用 ? 替代，注意：？只能替代动态值，不能是表名
         *  2.创建preparedStatement,并且传入动态值
         *  3.动态值 占位符 赋值 ？ 单独赋值即可
         *  4.发送SQL语句，并获取返回结果
         */
        String sql = "select * from t_user where account= ? and password = ? ;";
        //4.创建预编译statement并设置SQL语句结构
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.单独给每个占位符赋值
        /**
         * 参数1：index占位符的位置 从左到右数 从1开始
         * 参数2：object 占位符的值 可以设置任何类型的数据，避免了拼接带来的复杂性
         */
        preparedStatement.setObject(1, account);
        preparedStatement.setObject(2, password);
        //6.发送SQL语句，并返回结果
        //statement.executeUpdate | executeQuery(String sql) 需要传入sql语句
        //但preparedStatement已经知道语句和动态值了，就不用传入了
        ResultSet resultSet = preparedStatement.executeQuery();
        //7.结果集解析
        if(resultSet.next()){
            System.out.println("登录成功！");
        } else{
            System.out.println("登录失败！");
        }
        //8.关闭资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}
